{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tutorial 2 \n",
    "\n",
    "\n",
    "03/03/2019"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EXERCICE 1 -  Newton Interpolation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([15.,16,17,18,19,20,21,22,23,24,25,26,27,28])\n",
    "y = np.array([1.14,1.11,1.08,1.06,1.03,1.01,0.983,0.960,0.938,0.917,0.896,0.876,0.857,0.839])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([-5.,0,4,5])\n",
    "y = np.array([2,1,10,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "a1=2\n",
    "a2=-1/5\n",
    "a3=49/180\n",
    "a4=-227/900"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "xs = np.linspace(-6, 11, num=1000)\n",
    "ys = a1+ a2*(xs+5)**2 + a3*(xs+5)*xs + a4 *(xs+5)*xs*(xs-5)\n",
    "plt.scatter(x, y, s=50, color='red');\n",
    "# plt.plot( xs, ys, color='black');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Newton_interpolation():\n",
    "    \"\"\"x, y : data points in numpy.array type \"\"\"\n",
    "    def __init__(self, x=x, y=y):\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "    \n",
    "    \n",
    "    def Newton_coefficients (self): \n",
    "        self.x.astype(float)\n",
    "        self.y.astype(float)\n",
    "        n = len(self.x)\n",
    "        a = []\n",
    "        for i in range(n):\n",
    "            a.append(self.y[i])\n",
    "        for j in range(1, n):\n",
    "            for i in range(n-1, j-1, -1):\n",
    "                a[i] = float(a[i]-a[i-1])/float(self.x[i]-self.x[i-j])\n",
    "        return np.array(a) # array of coefficient\n",
    "\n",
    "    def eval_newton(self,r):\n",
    "        a = self.Newton_coefficients()\n",
    "        self.x.astype(float)\n",
    "        n = len(a) - 1\n",
    "        temp = a[n] + (r - x[n])\n",
    "        for i in range( n - 1, -1, -1 ):\n",
    "            temp = temp * ( r - x[i] ) + a[i]\n",
    "        return temp #y_value interpolation\n",
    "        \n",
    "    def plot_point(self):\n",
    "        return (plt.scatter( x, y, s=50, color='red'))\n",
    "        \n",
    "    \n",
    "    def plot_polynomial(self):\n",
    "        xs = np.linspace(self.x[0]-1, self.x[len(self.x)-1]+1, num=1000)\n",
    "        l=[]\n",
    "        for i in xs :\n",
    "            l.append(self.eval_newton(i))\n",
    "        self.plot_point()\n",
    "        return (plt.plot( xs, l, color='black'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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O08//TQXX3wxw8PDNf3e5s2baWtr44wzzmhyhNk4IpPXMcccw2mnncamTZtqWv6aa67hzjvv5NOf/nRp3pVIOnKddtpp/M3f/A1333037373u6sfaZrV7bffzmtf+1p6e3tziLBxR2TyArj00kv5yU9+wiOPPDLrcjfddBM33HAD73nPe7jyyitzik6SGnPZZZdx7bXX8rnPfY4bbrhh1mUffvhhfvrTn/K7v/u7OUXXuCM6eVUqFT772c/OuMxdd93Fu9/9bt785jfz8Y9/PMfoJKlxH/rQh7j44ov5kz/5EzZv3jzjcjfddBOVSoV3vOMdOUbXmCM2eR133HFccskl3HTTTfT19R32+JYtW7jgggs46aSTuOWWW6hUjrhPFUgquba2Nr74xS/y8pe/nI0bN3L//fcftkxfXx+f/exneetb38qxxx5bQJT1OWKTF8C1117L/v37ec973vOCnvBdd93F2WefzfLly/nGN75x8Pu3JKlsuru72bRpE8cccwxnnHEGd91118HHUkq8973v5cCBA1x33XUFRjl/R3Q58eu//utcd911vP/976dSqXDJJZfw9a9/nc985jOsX7+ezZs3s7rZ38UkSU22evVq7rnnHt70pjdx5plncvXVV3PWWWdx22238eUvf5kPf/jDnHLKKUWHOT+1nIajGZeiTg91qPHx8XTttdem9vb2BKS2trb0zne+M+3evbvo0CQpU3v27ElXXnnlwf1dpVJJ1157bRofHy86tIPI8sS8zVDIiXln0dfXx9atWzn55JNZuXJl0eFIUtPs3LmTrVu3ctJJJ7Xcca5aT8x7RLcNp+rt7S3N5xskqRErV64s/Zv0I3rChiSpnExekqTSMXlJkkrH5CVJKh2TlySpdExekqTSMXlJkkrH5CVJKh2TlySpdExekqTSMXlJkkrH5CVJKh2TlySpdExekqTSMXlJkkqnsC+jjIg+4BeH3L0S2FlAOM3gurSehbIe4Lq0qoWyLkWuxwkppTm/XLGw5DWdiNhSyzdoloHr0noWynqA69KqFsq6lGE9bBtKkkrH5CVJKp1WS143Fh1AhlyX1rNQ1gNcl1a1UNal5dejpY55SZJUi1arvCRJmpPJS5JUOoUlr4j4fEQ8GxE/n+axP4mIFBEri4htvmZal4j49xHxSEQ8GBEfLSq++ZhuXSLiFRFxX0T8NCK2RMSri4yxFhGxJiK+HREPT77+75m8f3lEfCMitk7+PKboWOcyy7p8LCL+MSIeiIj/LyKWFR3rbGZajymPl2a7n21dyrbdz/L/1drbfUqpkAvwBuC3gJ8fcv8a4E4mPsC8sqj4Gl0X4AzgfwGLJm8fW3ScDazLPwDnTl4/D/hO0XHWsB7HAb81eX0p8E/AqcBHgfdN3v8+4K+KjrWBdTkbqEze/1etvi4zrcfk7VJt97P8TUq33c+yLi293RdWeaWU7gZ2TfPQfwH+FCjNTJIZ1uVdwH9OKQ1NLvNs7oHVYYZ1ScBRk9ePBp7ONag6pJR+mVK6f/J6P/AwcDxwIfDFycW+CFxUTIS1m2ldUkr/kFIanVzsPmB1UTHWYpa/CZRsu59lXUq33c+yLi293bfUMa+IuAD455TSz4qOJQMnA6+PiB9ExF0R8S+KDqgB7wU+FhHbgI8Df1ZwPPMSEeuAVwI/AFallH4JExstcGxxkc3fIesy1b8DvpZ3PPWauh5l3+4P+ZuUers/ZF1aertvmeQVEUuAPwc+UHQsGakAxwCvAa4BbouIKDakur0L+KOU0hrgj4DPFRxPzSKiB/gq8N6U0vNFx9OImdYlIv4cGAW+VFRs8zF1PZiIu7Tb/TR/k9Ju99OsS0tv9y2TvICTgBOBn0XEk0y0QO6PiBcVGlX9tgN/nyb8EBhn4mSXZXQ58PeT1/8OaK0DtzOIiA4mNsYvpZSq8e+IiOMmHz8OaPm2Dsy4LkTE5cD5wNvT5MGJVjbNepR2u5/hb1LK7X6GdWnp7b5lkldK6f9PKR2bUlqXUlrHxD/Bb6WUnik4tHr9D+BMgIg4GeikvGebfho4ffL6mcDWAmOpyeS73c8BD6eU/u8pD21iYqNk8uftecc2XzOtS0ScA/yfwAUppX1FxVer6dajrNv9LP9fpdvuZ1mX1t7ui5opAnwF+CUwwsQ/7BWHPP4kJZh1NNO6MPFP+9+AnwP3A2cWHWcD6/I64MfAz5johb+q6DhrWI/XMXHA+QHgp5OX84AVwDeZ2BC/CSwvOtYG1uVRYNuU+z5TdKz1rMchy5Riu5/lb1K67X6WdWnp7d7TQ0mSSqdl2oaSJNXK5CVJKh2TlySpdExekqTSMXlJkkrH5CVJKh2TlySpdP43rjid5X3tq/EAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(7, 7))\n",
    "lag = Newton_interpolation(x,y)\n",
    "lag.plot_polynomial();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EXERCICE 2 - Simple Linear Regression \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([-5,0,5,10])\n",
    "y = np.array([10.1,3.5,-1.2,-6.8])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.4000000000000001"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## calculate the mean\n",
    "xbar = x.mean()\n",
    "ybar = y.mean()\n",
    "ybar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "154.09999999999997"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## calculate the sum of squared deviations\n",
    "St = sum((y-ybar)**2)\n",
    "St"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "yhat = 3.1-x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.66"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## calculate the sum of squares of the errors\n",
    "Sr = sum((y-yhat)**2)\n",
    "Sr "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9697598961713173"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##coefficient of determination\n",
    "R2 = 1-float(Sr/St)\n",
    "R2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.5264337522473748"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##standard Error of Estimate\n",
    "n=len(y)\n",
    "m = 2\n",
    "import math\n",
    "\n",
    "Syx = math.sqrt(Sr/(n-m))\n",
    "Syx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.165"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##MSE\n",
    "n =4\n",
    "(1/n) *Sr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EXERCICE 2bis - Simple Linear Regression "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([1,3,11,13])\n",
    "y = np.array([-1,3,17,21])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "yhat = -3+2*x\n",
    "\n",
    "\n",
    "xbar = x.mean()\n",
    "ybar = y.mean()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "340.0"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## calculate the sum of squared deviations\n",
    "St = sum((y-ybar)**2)\n",
    "St"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## calculate the sum of squares of the errors\n",
    "Sr = sum((y-yhat)**2)\n",
    "Sr "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9764705882352941"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##coefficient of determination\n",
    "R2 = 1-float(Sr/St)\n",
    "R2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x,y,color='red' );"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.6538461538461533"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "beta = sum((x - xbar)*(y-ybar))/ sum((x-xbar)**2)\n",
    "alpha = ybar - beta*xbar\n",
    "alpha"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs = np.linspace(0, 20, num=1000)\n",
    "linear_regression_Line = alpha +beta*xs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x,y,color='red' );\n",
    "plt.plot(xs,linear_regression_Line );"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EXERCICE 3 - Multiple Linear Regression \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import *\n",
    "from sklearn.datasets import load_boston\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "boston = load_boston()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      CRIM    ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD    TAX  \\\n",
      "0  0.00632  18.0   2.31   0.0  0.538  6.575  65.2  4.0900  1.0  296.0   \n",
      "1  0.02731   0.0   7.07   0.0  0.469  6.421  78.9  4.9671  2.0  242.0   \n",
      "2  0.02729   0.0   7.07   0.0  0.469  7.185  61.1  4.9671  2.0  242.0   \n",
      "3  0.03237   0.0   2.18   0.0  0.458  6.998  45.8  6.0622  3.0  222.0   \n",
      "4  0.06905   0.0   2.18   0.0  0.458  7.147  54.2  6.0622  3.0  222.0   \n",
      "\n",
      "   PTRATIO       B  LSTAT  PRICE  \n",
      "0     15.3  396.90   4.98   24.0  \n",
      "1     17.8  396.90   9.14   21.6  \n",
      "2     17.8  392.83   4.03   34.7  \n",
      "3     18.7  394.63   2.94   33.4  \n",
      "4     18.7  396.90   5.33   36.2  \n"
     ]
    }
   ],
   "source": [
    "bos = pd.DataFrame(boston.data)\n",
    "bos.columns = boston.feature_names\n",
    "bos['PRICE'] = boston.target\n",
    "print(bos.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             CRIM          ZN       INDUS        CHAS         NOX          RM  \\\n",
      "count  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000   \n",
      "mean     3.613524   11.363636   11.136779    0.069170    0.554695    6.284634   \n",
      "std      8.601545   23.322453    6.860353    0.253994    0.115878    0.702617   \n",
      "min      0.006320    0.000000    0.460000    0.000000    0.385000    3.561000   \n",
      "25%      0.082045    0.000000    5.190000    0.000000    0.449000    5.885500   \n",
      "50%      0.256510    0.000000    9.690000    0.000000    0.538000    6.208500   \n",
      "75%      3.677083   12.500000   18.100000    0.000000    0.624000    6.623500   \n",
      "max     88.976200  100.000000   27.740000    1.000000    0.871000    8.780000   \n",
      "\n",
      "              AGE         DIS         RAD         TAX     PTRATIO           B  \\\n",
      "count  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000   \n",
      "mean    68.574901    3.795043    9.549407  408.237154   18.455534  356.674032   \n",
      "std     28.148861    2.105710    8.707259  168.537116    2.164946   91.294864   \n",
      "min      2.900000    1.129600    1.000000  187.000000   12.600000    0.320000   \n",
      "25%     45.025000    2.100175    4.000000  279.000000   17.400000  375.377500   \n",
      "50%     77.500000    3.207450    5.000000  330.000000   19.050000  391.440000   \n",
      "75%     94.075000    5.188425   24.000000  666.000000   20.200000  396.225000   \n",
      "max    100.000000   12.126500   24.000000  711.000000   22.000000  396.900000   \n",
      "\n",
      "            LSTAT       PRICE  \n",
      "count  506.000000  506.000000  \n",
      "mean    12.653063   22.532806  \n",
      "std      7.141062    9.197104  \n",
      "min      1.730000    5.000000  \n",
      "25%      6.950000   17.025000  \n",
      "50%     11.360000   21.200000  \n",
      "75%     16.955000   25.000000  \n",
      "max     37.970000   50.000000  \n"
     ]
    }
   ],
   "source": [
    "print(bos.describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- CRIM per capita crime rate by town\n",
    "\n",
    "- ZN proportion of residential land zoned for lots over 25,000 sq.ft.\n",
    "\n",
    "- INDUS proportion of non-retail business acres per town\n",
    "\n",
    "- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n",
    "\n",
    "- NOX nitric oxides concentration (parts per 10 million)\n",
    "\n",
    "- RM average number of rooms per dwelling\n",
    "\n",
    "- AGE proportion of owner-occupied units built prior to 1940\n",
    "\n",
    "- DIS weighted distances to five Boston employment centres\n",
    "\n",
    "- RAD index of accessibility to radial highways\n",
    "\n",
    "- TAX full-value property-tax rate per $10,000\n",
    "\n",
    "- PTRATIO pupil-teacher ratio by town\n",
    "\n",
    "- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n",
    "\n",
    "- LSTAT % lower status of the population\n",
    "\n",
    "- MEDV Median value of owner-occupied homes in $1000’s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = bos.drop('PRICE', axis = 1)\n",
    "Y = bos['PRICE']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAde0lEQVR4nO3dbYxc1XkH8P/j8TjMkjSzDlvLHuPYSdBaoVu8YUWcOIqCSVgSE1gZioNI5VZU/hKpQOgm63xIoCLyptsG8qFK5Ya0lpKCEXYXJ5ZqEHbUFgUnu1kTx2CLV2MGgzcxkxB7ao93n36Ye9czs/dt3u49d+7/J6HduffuzmHm7uMzz3nOOaKqICKi+FkQdQOIiKgxDOBERDHFAE5EFFMM4EREMcUATkQUUwvDfLLLLrtMV65cGeZTEhHF3uTk5G9Vtaf2eKgBfOXKlZiYmAjzKYmIYk9EjjsdZwqFiCimGMCJiGKKAZyIKKYYwImIYooBnIgopgJVoYjIawDeBTAD4IKqDojIYgA7AawE8BqA21T1nVY38HPf/RlePHXG97rurjS+9cUrMdSfm3dufCqPsX3HkC8UkRLBjCqymTREgMLZEpZlMxge7MVQf27u2jcLRSzLZnDt6h4cODo999i+jogoahJkNUIrgA+o6m8rjv0DgNOqOioiIwC6VfXrXr9nYGBA6ykjDBq8bemUYOzWq6oC7PhUHlt3H0axNOP5s5l0CrdcncOuybzntZl0Cts29jGIE1FoRGRSVQdqjzeTQrkZwA7r+x0Ahpr4XY7qCd4AUJpRjO07VnVsbN8x3+ANAMXSDB45eML32mJpZt5zEBFFIWgAVwBPisikiGyxji1R1ZPW928BWOL0gyKyRUQmRGRienq6yeb6e7NQ9HzsZSbg2uj1/E4ionYJGsA/paofA/B5AF8RkU9XntRyHsYx+qnqdlUdUNWBnp55M0Fbblk24/nYS0qkoecgIopCoACuqnnr6ykA/wngGgBvi8hSALC+nmp1467400vruj6dEgwP9lYdGx7sRSad8v3ZTDqF2z9+ue+1mXRq3nMQEUXBN4CLyKUi8j77ewDXA/gNgD0ANluXbQbwRKsb99RXPxM4iHd3pecNYALAUH8O2zb2IWf1mu1edjaTRndXGgIgl81g28Y+PDDUN3etffzLa1dUPeYAJhGZwrcKRUQ+hHKvGyiXHf6Hqn5bRD4A4DEAKwAcR7mM8LTX76q3CgUoV5Hct+cICsVS1XFWgxBRUrhVofjWgavqKwCucjj+OwDXtaZ5zrxKAO1qEAZwIkoqo2di+pUAshqEiJLM6ADuF6BZDUJESWZ0APcL0KwGIaIkMzqADw/2wq0yO5tJM/9NRIlmdAAf6s/hjrUr5gXxTDqF+266MpI2ERGZwugADgAPDPXhwU1rWItNRFTD+ABORETOQt2VvhG1teD5QhFbdx8GAPbCiSjRjO+BO9WCc0lXIqIYBPC8Sy04J/EQUdIZHcDHp/KuZYScxENESWd0AB/bd8xxkXEBJ/EQERkdwN3SJwoOYBIRGR3A3XbICbpzDhFRJzM6gLvtURl070oiok5mdADPuQxUCsoDnERESWZ0AHdbzEoB1oETUeIZHcCH+nPOW92DdeBEREYHcKC8bKwT1oETUdIZHcDHp/J499yFecfTC4R14ESUeEYH8Pt/cgQzs/OTKBccjhERJY3RAfydsyXH4wpg6+7DrEQhokQzOoB74YqERJR0RgdwtwFMm9tUeyKiJDA6gN9305WeDeSUeiJKMqMD+FB/DplFKdfznFJPRElmdAAfn8rjzPkZ1/NuU+2JiJLA6ADuNUjJNcGJKOmMDuBe0+U/+eHFXBOciBLN6ADuNV3+mZdPY839T7IWnIgSy+gAPjzYi0zafRCzUCxxQg8RJZbRAXyoP4dtG/s8r+GEHiJKKqMDOFAO4n7VJlxaloiSyPgADvinUri0LBEl0cKoGxCEXW1y/0+OzFvgKpNOsZyQiBIpcA9cRFIiMiUiP7UerxKRgyLykojsFJFF7WtmOYhPffN6PLRpDXLZDATliTzbNvaxnJCIEqmeHvhdAF4A8CfW4+8AeFBVHxWRfwFwJ4Dvt7h9GJ/KY2zfMbxZKGJZNoPhwV48M7K+1U9DRBQ7gXrgIrIcwAYAP7AeC4D1AB63LtkBYKjVjRufymPr7sPIF4pQlFcfZNkgEVFZ0BTKQwC+BmDWevwBAAVVtfc7ewOAYx5DRLaIyISITExPT9fVuLF9x1AsVa+FwrJBIqIy3wAuIjcCOKWqk408gapuV9UBVR3o6emp62fdygNZNkhEFCwHvg7ATSLyBQCXoJwD/x6ArIgstHrhywG0PK+xLJtx3LSBZYNERAF64Kq6VVWXq+pKAF8CsF9V7wBwAMCt1mWbATzR6sYND/YinaretCGd4o70RERAcxN5vg7gqyLyEso58Ydb06QatXs2cA8HIiIAdQZwVf2Zqt5off+Kql6jqh9R1b9Q1XOtbtzYvmMozVZH7NKschCTiAiGT6XnICYRkTujA/j7XXaldztORJQkRgdwt03nz19w3yeTiCgpjA7ghZqFq2xnS7OcjUlEiWd0AM+k3ZvHgUwiSjqjA3ixNOt6jgOZRJR0Rgdwr5JvzsYkoqQzOoB7uXZ1feuqEBF1GqMDuEcKHLsm8xzIJKJEMzqAz3rkULisLBElndEBfMZn3ROnlQqJiJLC6ADuJ+U204eIKAFiHcBnlEsTElFyxTqA51hKSEQJFusAzo0diCjJYh3Ah/od91EmIkqEWAdwIqIki20A7+7imuBElGyxDeAb/nxp1E0gIoqU0QE85VHmzan0RJR0Rgfwf7ptjes5TqUnoqQzOoBPHD/teZ5rghNRkhkdwH/07Oue57kmOBElmdEB3EsmneJEHiJKtNgG8G0b+ziRh4gSLbYBnMGbiJIutgGciCjpGMCJiGIqtgGck3iIKOliG8Dv2XmIQZyIEi22AVwBfGP3r6NuBhFRZGIbwAHgbGk26iYQEUUm1gEcYC6ciJIr9gH8vj1Hom4CEVEkYh/AC8VS1E0gIoqEbwAXkUtE5Bci8pyIHBGR+63jq0TkoIi8JCI7RWRR+5tLRES2ID3wcwDWq+pVANYAuEFE1gL4DoAHVfUjAN4BcGf7munOb2u18ak81o3ux6qRvVg3up85cyLqGL4BXMv+aD1MW/8pgPUAHreO7wAw1JYW+vjWF690PTc+lcfW3YeRLxShAPKFIrbuPswgTkQdIVAOXERSInIIwCkATwF4GUBBVS9Yl7wBwHF1KRHZIiITIjIxPT3dijZX8VrUamzfMRRLM1XHuJMPEXWKQAFcVWdUdQ2A5QCuAbA66BOo6nZVHVDVgZ6engab6SwlHptmwn3HHu7kQ0SdoK4qFFUtADgA4BMAsiKy0Dq1HEDoeYm1H+r2PO+2Yw938iGiThCkCqVHRLLW9xkAnwPwAsqB/Fbrss0AnmhXI9289jvvnvTwYC8y6VTVMe7kQ0SdYqH/JVgKYIeIpFAO+I+p6k9F5HkAj4rIAwCmADzcxnY68kuF2PnxsX3H8GahiGXZDIYHe7kZBBF1BN8Arqq/BtDvcPwVlPPhkQmSChnqzzFgE1FHCtIDN1I6JcakQsan8uzlE1HoYhvAL1200Iggadea2+WKdq05wH07iai9YhvAg66B0u7esVetuf087KETUTvEejErvxmVYczE9Ks152xQImoXowO49zQd4N7HnvMMhGHMxPSrNedsUCJqF6MD+Cc/vNjz/IyqZ282jJmYfrXmnA1KRO1idAD3m6gDePdmw5iJOdSfw7aNfchlMxAAuWwG2zb2zeW4ORuUiNrF6EHMfMBeqltvdniwt6pCBGjPTEyvWvOw2kBEyWN0AA/KrTdrwkxME9pARJ0p9gHcrzdrwkxME9pARJ0n1gE8x94sESVYrAP4MyPro24CEVFkjK5C+fLaFa7ncqziIKKEM7oH/sBQHx49+Dou6PxzXYuq/+1xm65ee/za1T04cHSaA4pEFHtGB/A7/vXnjsEbAF48dQbjU/m5IO20oNTE8dPYNZmvOv6jZ1+f+x1ceIqI4szoFMozL5/2PG9P4HGbrv7IwRPzjtfitHYiiiujA7iffKGIdaP7XSf8zKhL970Gp7UTURzFOoAD5SDutuiV3671Nk5rJ6I4in0ABwCnfnYmncLtH7983kJTTtdxWjsRxVFHBPBa2Uwa2zb24YGhvnkLTa378OK5nnlKBLdczVmSRBRPRlehNOrS91zcbq1yGrtdrWLnxmdUsWsyj4EPLmYQJ6LY6cgeeL5QxKqRvVg3un9urfDxqTzufey50DZXGJ/KY93o/nntICJqlY7sgQOo2r7Mrgd3q0ppdRUKNzomojB0ZA+8UpB68GxXuqXPyW3UiCgMHR/AAf968IDl4oFxGzUiCkMiArif3xdLLf193EaNiMLAAI7WB1a/jY6JiFqhYwcxg2rXHpkAt1EjovZKdADv7krjW1+8si2BlduoEVG7JSqAC8rlhW5bsbmtKd6sdv1eIkq2RAXwBzetcQ2c7ardZk04EbVLogYxvQJmM7XbXrMuWRNORO2SqB74qpG9rimMRmu3/XrYrAknonZJVA+8cnp97dokjdZu+/WwWRNORO2SqABuK5ZmcPfOQ1XpjkZrt/162KwJJ6J28Q3gInK5iBwQkedF5IiI3GUdXywiT4nIi9bX7vY3t7XyhSLu2XkIK0f2YmzfMdxyda5q7fBtG/t8BxrdetILRLCqid9LRORH1GchEBFZCmCpqv5KRN4HYBLAEIC/AnBaVUdFZARAt6p+3et3DQwM6MTERODGrRzZG/jaVsikU3UH19oceKt+LxGRTUQmVXWg9rhvD1xVT6rqr6zv3wXwAoAcgJsB7LAu24FyUI+1RqpDhvpzVbv+OO3DyaoTImqHuqpQRGQlgH4ABwEsUdWT1qm3ACxx+ZktALYAwIoVKxptZ2jcdrj3UjnrcpXLpwZWnRBRqwUO4CLyXgC7ANytqn+Qip6mqqqIOOZiVHU7gO1AOYXSXHPbL+hO9m6WZTOO/whU5so5M5OIWiFQFYqIpFEO3j9W1d3W4bet/LidJz/Vnia21gKf+Oy3drgfv6oTO2eeLxQ9yxqJiPwEqUIRAA8DeEFVv1txag+Azdb3mwE80frmtd6sT3zONVmfXZsTr6064cxMImqVICmUdQD+EsBhETlkHfsGgFEAj4nInQCOA7itPU0MT6vqs71WIuTMTCJqFd8Arqr/i/JCfk6ua21zouO2QmGrBcmRExEF0XFroaQXCCBAaSZYLlvgvUphqw0P9s6rG/fq+XPAk4jcdEQAT4lgRhUpEWy65nIAwCMHTwQakFRUr1JYGTCzXWmolvfMbFXwrGe3Hi5FS0ReOiKA24F6RhU7f3ECkOpqkkw6hfcsXICCw+bFuZryvsqA+c7Zi9e3MngG3a3Ha8CTAZyIjA7gly5K4cx59ynqTkoOZSbF0gwuSS9AJp1yTF3YvW6/STyNBM9mUiAc8CQiL0avRjjbZE12pcLZkmN5H4C5uuwg8oVi4JrtZmu+uRQtEXkxugdeLM227HeJAPfsPIRl2UzVoOW60f2eC1E52br7MCaOn8aBo9OePetmUyD1DngSUbIYHcAbkV4gmAUwU5NKsR8G3THHS7E0gx8/+zrsZ3DLjzebAqlnwJOIkqejArhdy33fniOOA5a2yl6wW102AHR3pasGMivVJnecetatqPkOOuDZbixnJDKP0TnwepaVSongzUIRY/uOeQZvW75QxLrR/cgXivOeJ5NO4aFNazD1zevrmlpf27PulN14uH4LkZmMDuD1DGHOqM4Fl6CB3+4dKy7+Y1G7dolTEHb7/bU9a791UeKC67cQmcnoFErOI73hpZHaFbWe75mR9VXHnfLQ167uwa7JfKDBRVNSIM1gOSORmYzugYedanALSEP9OQwP9mJZNoM3C0UcODqdqH0uWc5IZCajA3jYAdEtIDnlgHdN5jE82ItXRzfgmZH1HRu8gc7J5RN1GqNTKGE7feYc+v/+SRTOVq99ct+eI0ZMaY+qEoTljI1h5Q61m/EBXNBYTrsRxdLs3OQhu9Ji4vhp16qWMHPAUS9s1Qm5/DBF/X5RMhidQgHCC95OiqUZ/OjZ113Pvz+TDq0trASJF75fFAbjA3gz7A2Kc9kMurtaH2zPnL8QWi00K0Hihe8XhcH4AJ5J19/EbCaN10Y34OVtX8BDm9YAgOuMymaUZjS0HhUrQeKF7xeFwfgAXs9sTNvvrZx1ZfVIu9gzOutZoXDd6H6sGtnr+3OV1545dwHpVPWrwUoQc7Fyh8Jg/CDm2QZWJMxa6RKnPGQ7BB2gqmdgq/baQrGE9AJBd1d6XpUMmYeVOxQGowN4o/nld86W5tY5CUuQssJ6lpd1urY0q+hatBBT37y+dQ2ntmHlDrWb0QG8mfyyvSZKmFUsfv9g1DOw1cpBMNYjE3Umo3PgzY7YVy5SZWskpx6UXfXipp6BrVYNgnElQaLOZXQAb8WIveJiYE2J4I61K9oWxCs3UnYarKxnYKtVg2CsRybqXEYH8OHB3qaDraBm1/pfnmhbN9xeO9yt1wsg8PKyrVqKlvXIRJ3L6Bz4UH8OE8dPV21fVg+nHHhppj1Z8cresVevt56Fr1oxCNaKXYGIyExG98AB4IGhPjy4aU3gnXEqN2YIYwDTqXfs1ru1a8aD1IC3CuuRiTqX8QG8soLCbZDQPpwSmduYYXiwt67t0BrNqjhVdXj1bls5mBhkUlCn7ApERPOJaniFdgMDAzoxMRH4+trJLE4y6RRuuTrnuEOO03Enje78U/lclUExSLsrn7t2F6AgnJ6jth1E1BlEZFJVB2qPG90Dd5tJmRKp6k0eODrtmHM+cHS6qvfZ3ZVGeoHzdPR6euu1aqs67F6vX1kh0PhgIqtLiMjoQUy34DarildHN8w9vmfnIdefrx0I9JrUcs/OQw3nzWvbOtSfc21XpUYHE1ldQkRGB/CgFRT1VFo4VXbYQb2ZZNKyihJC+x+IBSJVteG1BBcHNuudHZmk6hLOJCVyZnQKJWgFRTOVFo2sWOi2KmBt/bdT8JaKr/bZRgY0k1JdwpmkRO6MDuBBKyiaqbSod8XCXDaDsVuvcnyuIDl7uySyNrTXm792+n++5epyG9yqUtyqVupZ4jZszPVTnLX7b8voKpQwrBrZ65o6qZ0I5FXlMT6Vx90eOe9cNjOXAnDr7QuAV0c3NJQy8KtKcTvvVsFjSjWL2/tjv1ZEpmplpVjDVSgi8kMROSUiv6k4tlhEnhKRF62v3XW1xiBuOePK3rJfr95+o9zYuW47BeBWm7Ism2k4ZeDXU3U7/8jBE0b3cLmzDcVVGJ8eg6RQ/h3ADTXHRgA8rapXAHjaehxLXrnkof4cnhlZj1dHN7hOgR+fyuPex55zTcM4Ted3WiXRfs5G33S/qhS3826DrKZUsyQl10+dJ4xKMd8Arqr/DeB0zeGbAeywvt8BYKhlLQqZX/7cK4dl95a9Kk3cztgzRmufs9E33a+n6nberVbdlB4uZ5JSXIXx6bHRMsIlqnrS+v4tAEvcLhSRLQC2AMCKFSsafLr2cls0ym8LNL8B0Fw2gzPnLqBQnL+hcjaTdpyB2Wh54PBgr2O+ze6pup13y4Gb1MPlzjYUR35/k63QdBWKlkdBXbugqrpdVQdUdaCnp6fZpwuVXzrDq1dsv1FukzHdjjeaMvDrqbqdf2Cojz1cojYI49Njoz3wt0VkqaqeFJGlAE61rEUG8UtnuPWWUyJzb5TbbMzC2fm9ciDYZrhuVSp+PVW38+zhkik6bdJWu/+2Gg3gewBsBjBqfX2iZS2KiNON45fOcPuIVPmvrNvvUMB1BqbXm17PzvZJ1mmBIAl4b9cvSBnhIwB+DqBXRN4QkTtRDtyfE5EXAXzWehxbbqV7167u8UxnDPXncMvVuaot2265+mLwHZ/K4+z5C67Pmy8UcffOQ1hz/5OBC/xbUZpk8sSdVuDszXjipK36+fbAVfV2l1PXtbgtrtrdm3K7cezVDN2ee3wqj12T+aot23ZN5jHwwcUAEHhJ2UKxFLin0WxpUhJ6OV6BoFP+HzsRF2irn9GLWQHhBByvG8crneHXY6hnin7QANPsIlZJCG4MBPGUpAXaWsXotVCAcD5WNVqv6RUoGgkWQX6m2YktSQhunL0ZT5y0VT/jA3gYAafeG8fOIbvVTi7LZlyDhdcWD0ECTJDSJK8cdxKCGwNBPHHSVv2MT6GE8bEqSOmezW+7tMpA4XTdJekFWCCCM+erj6dTgjPnLmDVyF4sy2Zw7eoeHDg67dieZqpUwphcELV63k8yC0ta62P8aoTjU3kMP/4cSjMX25lOCcZuvSqSN3rd6H7X1QRzDoOc9//kCN6pqfm2Z0DaATrblcYf/+8CSrPu70XQVczc2le59yZL7Lzx9SHTuK1GaHwPHIDzalARcUvdCDBvarw93b42gNsVLvb160b3z7umVtCBxiApJ/Zy3CWhSoc6h/E58LF9x+b1TEuzGlltaL055CABNWg+P8h1SchxtxNrkSlOjA/gplRN2AODTut5e+WQgwTUoME1yHUcwGuOKfcbURDGB3ATepS1+2ZWruftN1IeJKA6XVMraBDmSH5zTLjfiIIyPgduQtWE08dqez1vpyVhKwWpiHC6xqsKxQ9z3I0z4X4jCsr4AG5CSVizH6uDBNSwgy4rLZyZcL8RBWV8AAei71F22hRfVlp4i/p+IwrK+By4CTptYJCVFkSdIRY98Kh12sfquFZaMO1jHr4n0WIAD6iTPlbHMSXEtI95+J5EjymUBIpjSohpH/PwPYkee+AJFMeUUFzTPp2M70n0GMATKm4poTimfTod35PoMYVCsRDHtE+n43sSPfbAKRbimPbpdHxPomf8euBEREnnth44UyhERDHFAE5EFFMM4EREMcUATkQUUwzgREQxFWoViohMAzje4I9fBuC3LWxO3PH1mI+vSTW+HvPF9TX5oKr21B4MNYA3Q0QmnMpokoqvx3x8Tarx9Ziv014TplCIiGKKAZyIKKbiFMC3R90Aw/D1mI+vSTW+HvN11GsSmxw4ERFVi1MPnIiIKjCAExHFVCwCuIjcICLHROQlERmJuj1hE5HLReSAiDwvIkdE5C7r+GIReUpEXrS+dkfd1jCJSEpEpkTkp9bjVSJy0LpPdorIoqjbGCYRyYrI4yJyVEReEJFPJPkeEZF7rL+X34jIIyJySafdI8YHcBFJAfhnAJ8H8FEAt4vIR6NtVeguALhXVT8KYC2Ar1ivwQiAp1X1CgBPW4+T5C4AL1Q8/g6AB1X1IwDeAXBnJK2KzvcA/JeqrgZwFcqvTSLvERHJAfhbAAOq+mcAUgC+hA67R4wP4ACuAfCSqr6iqucBPArg5ojbFCpVPamqv7K+fxflP8wcyq/DDuuyHQCGomlh+ERkOYANAH5gPRYA6wE8bl2StNfj/QA+DeBhAFDV86paQILvEZQ3rMmIyEIAXQBOosPukTgE8ByAExWP37COJZKIrATQD+AggCWqetI69RaAJRE1KwoPAfgagFnr8QcAFFT1gvU4affJKgDTAP7NSiv9QEQuRULvEVXNA/hHAK+jHLh/D2ASHXaPxCGAk0VE3gtgF4C7VfUPlee0XA+aiJpQEbkRwClVnYy6LQZZCOBjAL6vqv0AzqAmXZKwe6Qb5U8fqwAsA3ApgBsibVQbxCGA5wFcXvF4uXUsUUQkjXLw/rGq7rYOvy0iS63zSwGciqp9IVsH4CYReQ3llNp6lPO/WevjMpC8++QNAG+o6kHr8eMoB/Sk3iOfBfCqqk6ragnAbpTvm466R+IQwH8J4Apr9HgRygMReyJuU6is/O7DAF5Q1e9WnNoDYLP1/WYAT4Tdtiio6lZVXa6qK1G+H/ar6h0ADgC41bosMa8HAKjqWwBOiIi9Jfx1AJ5HQu8RlFMna0Wky/r7sV+PjrpHYjETU0S+gHLOMwXgh6r67YibFCoR+RSA/wFwGBdzvt9AOQ/+GIAVKC/Te5uqno6kkRERkc8A+DtVvVFEPoRyj3wxgCkAX1bVc1G2L0wisgblQd1FAF4B8Ncod9ISeY+IyP0ANqFcxTUF4G9Qznl3zD0SiwBORETzxSGFQkREDhjAiYhiigGciCimGMCJiGKKAZyIKKYYwImIYooBnIgopv4f6aANi50V22cAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X['CRIM'], Y);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.08011358e-01,  4.64204584e-02,  2.05586264e-02,  2.68673382e+00,\n",
       "       -1.77666112e+01,  3.80986521e+00,  6.92224640e-04, -1.47556685e+00,\n",
       "        3.06049479e-01, -1.23345939e-02, -9.52747232e-01,  9.31168327e-03,\n",
       "       -5.24758378e-01])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "lm = LinearRegression()\n",
    "model = lm.fit(X, Y)\n",
    "#coefficients for the predictors\n",
    "model.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "36.45948838508978"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lm.intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
